package process

import (
	"encoding/json"
	"errors"
	"fmt"
	clientmode "helloword01/31chatroom/client/model"
	commonmodel "helloword01/31chatroom/common/model"
	"helloword01/31chatroom/common/utils"
	"net"
)

type UserProcess struct {
}

// Login
//
//	@Description: 登录
//	@receiver this
//	@param userId
//	@param userPwd
//	@return err
func (this *UserProcess) Login(userId int, userPwd string) (err error) {
	//1.连接至服务端
	conn, err := net.Dial("tcp", "127.0.0.1:8889")
	if err != nil {
		return errors.New("连接服务器失败")
	}
	fmt.Println(conn.RemoteAddr().String(), ":连接服务器成功!!!")
	defer conn.Close()

	//2.创建登录消息体 message.LoginMes
	var loginMes commonmodel.LoginMes
	loginMes.UserId = userId
	loginMes.UserPwd = userPwd
	data, err := json.Marshal(loginMes)
	if err != nil {
		return errors.New("json序列化失败")
	}

	//3.构建通用消息体
	data, err = utils.BuildMessage(data, commonmodel.LoginMesType)
	if err != nil {
		return errors.New(err.Error())
	}

	//4.发送登录消息
	err = utils.WritePkg(conn, data)
	if err != nil {
		return errors.New(err.Error())
	}

	//5.读取登录返回的消息
	tf := &utils.Transfer{
		Conn: conn,
	}
	var mes commonmodel.Message
	mes, err = tf.ReadPkg()
	if err != nil {
		return errors.New(err.Error())
	}

	//6.解析登录返回的消息-做判断
	var loginResMes commonmodel.LoginResMes
	err = json.Unmarshal([]byte(mes.Data), &loginResMes)
	if loginResMes.Code == 200 {
		//初始化curUser
		clientmode.InitCurUser(conn, userId, commonmodel.UserOnline)

		//6.1登录成功，展示在线的用户列表，并将所有前户放入在线map中
		for _, uId := range loginResMes.UsersId {
			putUserToOnlineUser(&commonmodel.User{
				UserId:     uId,
				UserStatus: commonmodel.UserOnline,
			})
		}
		fmt.Printf("[%d] 登录成功 ", userId)
		printOnlineUser()
		//6.2
		//这里我们还需要在客户端启动一个协程
		//该协程保持和服务器端的通讯.如果服务器有数据推送给客户端，则接收并显示在客户端的终端
		go serverProcessMes(conn)

		//6.3 显示我们的登录成功的菜单[循环]..
		for {
			showMenu()
		}

	} else {
		fmt.Println("登录失败")
	}

	return nil
}

// Register 注册
//
//	@Description:
//	@receiver this
//	@param userId
//	@param userPwd
//	@param userName
//	@return err
func (this *UserProcess) Register(userId int, userPwd string, userName string) (err error) {
	//1.连接服务端
	conn, err := net.Dial("tcp", "127.0.0.1:8889")
	if err != nil {
		return errors.New("连接服务器失败")
	}
	fmt.Println("连接服务器成功")
	defer conn.Close()

	//2.构建 注册消息体
	var registerMes commonmodel.RegisterMes
	registerMes.User.UserId = userId
	registerMes.User.UserPwd = userPwd
	registerMes.User.UserName = userName
	data, err := json.Marshal(registerMes)
	if err != nil {
		return errors.New(commonmodel.SerializeJsonError)
	}

	//3.构建通用消息体
	data, err = utils.BuildMessage(data, commonmodel.RegisterMesType)
	if err != nil {
		return errors.New(err.Error())
	}

	//4.发送注册消息
	err = utils.WritePkg(conn, data)
	if err != nil {
		return errors.New(err.Error())
	}

	//fmt.Println("client#Register-发送：", string(data))
	//5.读取注册结果消息
	tf := &utils.Transfer{
		Conn: conn,
	}
	var mes commonmodel.Message
	mes, err = tf.ReadPkg()
	if err != nil {
		return errors.New(err.Error())
	}

	//6.解析注册结果消息-做判断
	var registerResMes commonmodel.RegisterResMes
	err = json.Unmarshal([]byte(mes.Data), &registerResMes)

	//fmt.Println("client#Register-收到：", registerResMes)
	if registerResMes.Code == 200 {
		fmt.Println("注册成功，请重新登录")
		//os.Exit(0)
	} else {
		fmt.Println(registerResMes.Error)
		//os.Exit(0)
	}
	return nil

}
